using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.Look.Imagem.Entidades;

namespace MakeIT.Look.Imagem.Negocios
{
	public partial class LookDAOT : DAOT
	{

		public OrcamentoVO getOrcamento(int? idOrcamento, string contato)
		{
			OrcamentoVO orcamentoVO = null;
			List<OrcamentoVO> listOrcamentoVOs = getOrcamentos(idOrcamento, contato, null, null, null, null, null, null, null, null);
			if (listOrcamentoVOs != null && listOrcamentoVOs.Count > 0)
			{
				orcamentoVO = listOrcamentoVOs[0];
			}
			return orcamentoVO;
		}

		public OrcamentoVO getOrcamento(int? idOrcamento)
		{
			return getOrcamento(idOrcamento, null);
		}

		public List<OrcamentoVO> getOrcamentos()
		{
			return getOrcamentos(null, null, null, null, null, null, null, null, null, null);
		}

		public List<OrcamentoVO> getOrcamentos(int? idOrcamento)
		{
			return getOrcamentos(idOrcamento, null, null, null, null, null, null, null, null, null);
		}

		public List<OrcamentoVO> getOrcamentos(int? idOrcamento, string contato)
		{
			return getOrcamentos(idOrcamento, contato, null, null, null, null, null, null, null, null);
		}

		public List<OrcamentoVO> getOrcamentos(int? idOrcamento, string contato, int? idEventoTipo, string origem, bool? atendido, string fones, string email, DateTime? dtEvento, string cerimonia, string recepcao)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT orc.idOrcamento as orc_idOrcamento, orc.origem as orc_origem, orc.atendido as orc_atendido, orc.contato as orc_contato, orc.fones as orc_fones, orc.email as orc_email, orc.dtEvento as orc_dtEvento, orc.convidados as orc_convidados, orc.cerimonia as orc_cerimonia, orc.recepcao as orc_recepcao, orc.mensagem as orc_mensagem, orc.idEventoTipo as orc_idEventoTipo, evt.eventoTipo as evt_eventoTipo, orc.cadastro as orc_cadastro, orc.cadastradoPor as orc_cadastradoPor, orc.edicao as orc_edicao, orc.editadoPor as orc_editadoPor  ");
			query.AppendLine("FROM orcamento as orc LEFT OUTER JOIN eventotipo as evt on orc.idEventoTipo=evt.idEventoTipo  ");
			if (idOrcamento != null)
			{
				query.AppendLine(where + "orc.idOrcamento=@idOrcamento ");
				where = "AND ";
			}
			if (origem != null)
			{
				query.AppendLine(where + "orc.origem=@origem ");
				where = "AND ";
			}
			if (atendido != null)
			{
				query.AppendLine(where + "orc.atendido=@atendido ");
				where = "AND ";
			}
			if (contato != null)
			{
				query.AppendLine(where + "orc.contato LIKE @contato ");
				where = "AND ";
			}
			if (fones != null)
			{
				query.AppendLine(where + "orc.fones=@fones ");
				where = "AND ";
			}
			if (email != null)
			{
				query.AppendLine(where + "orc.email=@email ");
				where = "AND ";
			}
			if (dtEvento != null)
			{
				query.AppendLine(where + "orc.dtEvento=@dtEvento ");
				where = "AND ";
			}
			if (cerimonia != null)
			{
				query.AppendLine(where + "orc.cerimonia=@cerimonia ");
				where = "AND ";
			}
			if (recepcao != null)
			{
				query.AppendLine(where + "orc.recepcao=@recepcao ");
				where = "AND ";
			}
			if (idEventoTipo != null)
			{
				query.AppendLine(where + "orc.idEventoTipo=@idEventoTipo ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY orc.contato ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idOrcamento!= null) cmd.Parameters.Add(getParameter(cmd, "@idOrcamento", idOrcamento));
			if (origem!= null) cmd.Parameters.Add(getParameter(cmd, "@origem", origem));
			if (atendido!= null) cmd.Parameters.Add(getParameter(cmd, "@atendido", atendido.Value?"S":"N"));
			if (contato!= null) cmd.Parameters.Add(getParameter(cmd, "@contato", "%"+contato+"%"));
			if (fones!= null) cmd.Parameters.Add(getParameter(cmd, "@fones", fones));
			if (email!= null) cmd.Parameters.Add(getParameter(cmd, "@email", email));
			if (dtEvento!= null) cmd.Parameters.Add(getParameter(cmd, "@dtEvento", dtEvento));
			if (cerimonia!= null) cmd.Parameters.Add(getParameter(cmd, "@cerimonia", cerimonia));
			if (recepcao!= null) cmd.Parameters.Add(getParameter(cmd, "@recepcao", recepcao));
			if (idEventoTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idEventoTipo", idEventoTipo));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<OrcamentoVO> listOrcamento = new List<OrcamentoVO>();

				while (reader.Read())
				{
					OrcamentoVO orcamentoVO = OrcamentoVO.CreateVO();
					orcamentoVO.idOrcamento = reader.GetInt32(reader.GetOrdinal("orc_idOrcamento"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_origem")))
						orcamentoVO.origem = reader.GetString(reader.GetOrdinal("orc_origem"));
					orcamentoVO.atendido = reader.GetString(reader.GetOrdinal("orc_atendido")).Equals("S");
					orcamentoVO.contato = reader.GetString(reader.GetOrdinal("orc_contato"));
					orcamentoVO.fones = reader.GetString(reader.GetOrdinal("orc_fones"));
					orcamentoVO.email = reader.GetString(reader.GetOrdinal("orc_email"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_dtEvento")))
						orcamentoVO.dtEvento = reader.GetDateTime(reader.GetOrdinal("orc_dtEvento"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_convidados")))
						orcamentoVO.convidados = reader.GetInt32(reader.GetOrdinal("orc_convidados"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_cerimonia")))
						orcamentoVO.cerimonia = reader.GetString(reader.GetOrdinal("orc_cerimonia"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_recepcao")))
						orcamentoVO.recepcao = reader.GetString(reader.GetOrdinal("orc_recepcao"));
					if (!reader.IsDBNull(reader.GetOrdinal("orc_mensagem")))
						orcamentoVO.mensagem = reader.GetString(reader.GetOrdinal("orc_mensagem"));
					orcamentoVO.idEventoTipo = reader.GetInt32(reader.GetOrdinal("orc_idEventoTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("evt_eventoTipo")))
						orcamentoVO.idEventoTipoVO.eventoTipo = reader.GetString(reader.GetOrdinal("evt_eventoTipo"));
					orcamentoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("orc_cadastro"));
					orcamentoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("orc_cadastradoPor"));
					orcamentoVO.edicao = reader.GetDateTime(reader.GetOrdinal("orc_edicao"));
					orcamentoVO.editadoPor = reader.GetString(reader.GetOrdinal("orc_editadoPor"));


					listOrcamento.Add(orcamentoVO);
				}
				reader.Close();
				return listOrcamento;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setOrcamento(OrcamentoVO orcamentoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE orcamento ");
			query.AppendLine("SET origem=@origem, atendido=@atendido, contato=@contato, fones=@fones, email=@email, dtEvento=@dtEvento, convidados=@convidados, cerimonia=@cerimonia, recepcao=@recepcao, mensagem=@mensagem, idEventoTipo=@idEventoTipo,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idOrcamento=@idOrcamento ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idOrcamento", orcamentoVO.idOrcamento));
			if (orcamentoVO.origem == null)
				cmd.Parameters.Add(getParameter(cmd, "@origem", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@origem", orcamentoVO.origem));
			cmd.Parameters.Add(getParameter(cmd, "@atendido", (orcamentoVO.atendido==null?" ":(orcamentoVO.atendido.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@contato", orcamentoVO.contato));
			cmd.Parameters.Add(getParameter(cmd, "@fones", orcamentoVO.fones));
			cmd.Parameters.Add(getParameter(cmd, "@email", orcamentoVO.email));
			if (orcamentoVO.dtEvento == null)
				cmd.Parameters.Add(getParameter(cmd, "@dtEvento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@dtEvento", orcamentoVO.dtEvento));
			if (orcamentoVO.convidados == null)
				cmd.Parameters.Add(getParameter(cmd, "@convidados", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@convidados", orcamentoVO.convidados));
			if (orcamentoVO.cerimonia == null)
				cmd.Parameters.Add(getParameter(cmd, "@cerimonia", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cerimonia", orcamentoVO.cerimonia));
			if (orcamentoVO.recepcao == null)
				cmd.Parameters.Add(getParameter(cmd, "@recepcao", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@recepcao", orcamentoVO.recepcao));
			if (orcamentoVO.mensagem == null)
				cmd.Parameters.Add(getParameter(cmd, "@mensagem", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@mensagem", orcamentoVO.mensagem));
			cmd.Parameters.Add(getParameter(cmd, "@idEventoTipo", orcamentoVO.idEventoTipo));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", orcamentoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", orcamentoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", orcamentoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", orcamentoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newOrcamento(OrcamentoVO orcamentoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO orcamento ");
			query.AppendLine("  ( origem, atendido, contato, fones, email, dtEvento, convidados, cerimonia, recepcao, mensagem, idEventoTipo, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @origem, @atendido, @contato, @fones, @email, @dtEvento, @convidados, @cerimonia, @recepcao, @mensagem, @idEventoTipo, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (orcamentoVO.origem == null)
				cmd.Parameters.Add(getParameter(cmd, "@origem", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@origem", orcamentoVO.origem));
			cmd.Parameters.Add(getParameter(cmd, "@atendido", (orcamentoVO.atendido==null?" ":(orcamentoVO.atendido.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@contato", orcamentoVO.contato));
			cmd.Parameters.Add(getParameter(cmd, "@fones", orcamentoVO.fones));
			cmd.Parameters.Add(getParameter(cmd, "@email", orcamentoVO.email));
			if (orcamentoVO.dtEvento == null)
				cmd.Parameters.Add(getParameter(cmd, "@dtEvento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@dtEvento", orcamentoVO.dtEvento));
			if (orcamentoVO.convidados == null)
				cmd.Parameters.Add(getParameter(cmd, "@convidados", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@convidados", orcamentoVO.convidados));
			if (orcamentoVO.cerimonia == null)
				cmd.Parameters.Add(getParameter(cmd, "@cerimonia", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cerimonia", orcamentoVO.cerimonia));
			if (orcamentoVO.recepcao == null)
				cmd.Parameters.Add(getParameter(cmd, "@recepcao", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@recepcao", orcamentoVO.recepcao));
			if (orcamentoVO.mensagem == null)
				cmd.Parameters.Add(getParameter(cmd, "@mensagem", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@mensagem", orcamentoVO.mensagem));
			cmd.Parameters.Add(getParameter(cmd, "@idEventoTipo", orcamentoVO.idEventoTipo));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", orcamentoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", orcamentoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", orcamentoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", orcamentoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('orcamento') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delOrcamento(OrcamentoVO orcamentoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM orcamento ");
			query.AppendLine("WHERE idOrcamento=@idOrcamento ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idOrcamento", orcamentoVO.idOrcamento));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountOrcamentoxIdEventoTipo(int? idEventoTipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idEventoTipo) as ocorrencias FROM orcamento WHERE IdEventoTipo=@IdEventoTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdEventoTipo", idEventoTipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
